#ifndef _FIXEDBUFFER_H
#define _FIXEDBUFFER_H

#include <cstddef>
#include <cstring>
namespace droneswarm
{
    //这是定义一个自定义缓冲区的类。
    const int kSmallBuffer = 4000;
    const int kLargeBuffer = 4000 * 1000;

    template < int size >
    class FixedBuffer
    {
    public:
        FixedBuffer()
            : cur_( data_ ){};
        ~FixedBuffer(){};

        //这个方法用来向缓冲区中写入数据
        void append( const char *buf, const size_t len )
        {
            if ( avail() > static_cast< int >( len ) )
            {
                //将数据拷贝到缓冲区
                memcpy( cur_, buf, len );
                //移动指针
                cur_ += len;
            }
        }

        //返回数据的首地址
        const char *data() const { return data_; }
        //返回数据的长度
        int length() const { return static_cast< int >( cur_ - data_ ); }
        //返回缓冲区的剩余空间
        int avail() const { return static_cast< int >( end() - cur_ ); }  //返回缓冲区剩余的空间
        //获取当前写缓冲区的指针
        char *current() { return cur_; }
        //将当前写缓冲区的指针移动n个位置
        void add( int len ) { cur_ += len; }

        //重置缓冲区，将缓冲中指针移动到缓冲区的首地址
        void reset() { cur_ = data_; }
        //清空缓冲区，缓冲区全部填0
        void bzero() { memset( data_, 0, sizeof( data_ ) ); }

    private:
        const char *end() const { return data_ + sizeof data_; }  // data是首地址，sizeof data_是缓冲区的大小，所以end()返回的是缓冲区的尾地址
        char data_[ size ];                                       //这是存放数据的缓冲区
        char *cur_;  //这是用来操作缓冲区的指针，这个指针在写入一次后，会移动到上次写入长度为n的数据的后面。这样就可以从这个位置继续写入数据。

    private:
        FixedBuffer( const FixedBuffer & ) = delete;
        FixedBuffer( const FixedBuffer && ) = delete;
        FixedBuffer &operator=( const FixedBuffer & ) = delete;
    };
}  // namespace droneswarm

#endif